package day17.api;
//测试 多线程售票
//1, 需求: 设计4个售票窗口，总计售票100张。
public class Test2 {
    public static void main(String[] args) {
        MyTickets2 target = new MyTickets2();
        Thread t1 = new Thread(target);
        Thread t2 = new Thread(target);
        Thread t3 = new Thread(target);
        Thread t4 = new Thread(target);
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}
//方式2:: implements Runnable
class MyTickets2 implements Runnable{
    int tickets = 100 ;//定义变量,记录票数
    Object o = new Object();
    String s = "123";
    //TODO 1,现在由于多线程 中,,对于共享资源进行了抢的操作,所以共享资源不安全
    //可以使用锁 来保证安全,但是牺牲性能.synchronized表示锁
    //锁可以用在方法上也可以用在代码块上.
    //同步方法  synchronized public void run() {
    //同步代码块 -- synchronized(锁对象){有问题代码}
    @Override
     public void run() {
        //开始卖票
        while(true){
        //TODO 2,同步代码块:需要考虑两个问题
//1,锁的位置(合理位置,从开始用到用完结束) 2,锁对象(可以任务,但必须是同一个对象)
//            synchronized(new Object()){//四个线程new了4把锁,不是同一个锁对象,错的
//            synchronized(o){//同一个锁对象,OK
//            synchronized(s){//同一个锁对象,OK
            synchronized(this){
                if (tickets > 0) {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + "~" + tickets--);
                } else {
                    break;
                }
            }
        }
    }
}


